#ifndef HSV_H
#define HSV_H

#include <iostream>
#include <algorithm>  // 用于 std::max 和 std::min
#include <cmath>      // 用于 fmod 和 round

struct HSL {
    double h; // 色相 (0-360 度)
    double s; // 饱和度 (0-100%)
    double l; // 明度 (0-100%)
};

HSL rgbToHsl(int r, int g, int b) {
    // 参数范围约束 (0-255)
    r = std::max(0, std::min(255, r));
    g = std::max(0, std::min(255, g));
    b = std::max(0, std::min(255, b));

    // 将 RGB 归一化到 0~1
    double R = r / 255.0;
    double G = g / 255.0;
    double B = b / 255.0;

    double maxVal = std::max({R, G, B});
    double minVal = std::min({R, G, B});
    double delta = maxVal - minVal;

    HSL hsl;
    hsl.l = (maxVal + minVal) / 2.0; // 计算明度

    // 处理灰度色（无颜色）
    if (delta < 1e-6) {
        hsl.h = 0.0;
        hsl.s = 0.0;
        return hsl;
    }

    // 计算饱和度
    hsl.s = (hsl.l < 0.5) ? (delta / (maxVal + minVal)) : (delta / (2.0 - maxVal - minVal));

    // 计算色相
    if (maxVal == R) {
        hsl.h = (G - B) / delta + ((G < B) ? 6.0 : 0.0);
    } else if (maxVal == G) {
        hsl.h = (B - R) / delta + 2.0;
    } else { // maxVal == B
        hsl.h = (R - G) / delta + 4.0;
    }

    hsl.h *= 60.0; // 转换为角度
    if (hsl.h < 0) hsl.h += 360.0; // 确保角度在 0~360 之间

    // 转换为百分比
    hsl.s *= 100.0;
    hsl.l *= 100.0;

    return hsl;
}


#endif // HSV_H
